home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / PD_THEMA / CPX / BOOTCPX / BOOT.C < prev    next >
C/C++ Source or Header  |  1998-03-14  |  30KB  |  1,049 lines

  1. /*******************************************/
  2. /* File : BOOT.C                           */
  3. /* --------------------------------------- */
  4. /* Module : BOOT.CPX        versie 1.00    */
  5. /* (C) 1990 by MAXON Computer              */
  6. /* Auteurs : Uwe Hax & Oliver Scholz       */
  7. /* Gebruikte Compiler : Turbo-C 2.0        */
  8. /*******************************************/
  9.  
  10. /* De gebruikelijke header gegevens */
  11.  
  12. #include <portab.h>
  13. #include <aes.h>
  14. #include <tos.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <vdi.h>
  18.  
  19.  
  20. /* Geen variabelen om op te slaan */
  21.  
  22. #include "boot.rsh"
  23. #include "boot.h"
  24. #include "xcontrol.h"
  25.  
  26.  
  27. /* Definities voor eem betere leesbaarheid */
  28.  
  29. #define TRUE            1    /* Standaard def. */
  30. #define FALSE            0
  31. #define EOS                '\0'
  32. #define NIL                0L
  33.  
  34. #define MESSAGE            -1    /* Message-Event */
  35.  
  36. #define MAX_ACTIVE        50    /* Maximaal aantal */
  37. #define MAX_INACTIVE    50    /* entries         */
  38. #define VISIBLE            5    /* Zichtbare entries */
  39. #define NAME_LENGTH        8+1    /* Lengte entry */
  40.  
  41. #define MIN_SIZE        6    /* Slider grootte */
  42.  
  43. #define ACTIVE            TRUE  /* FLAGS */
  44. #define INACTIVE        FALSE
  45. #define HORIZONTAL        1
  46. #define VERTICAL        0
  47. #define ACC                1
  48. #define PRG                0
  49.  
  50. #define _bootdev        0x447 /* Systeem variabele */
  51.  
  52.  
  53. /* Globale variabelen */
  54.  
  55. typedef    struct
  56. {
  57.   WORD max_num;            /* Aantal maximale entries */
  58.   WORD num;                /* Aantal entries */
  59.   WORD begin;            /* Eerste zichtbare entry */
  60.   WORD type;            /* ACC of PRG */
  61.   WORD selected;        /* nummer van geselecteerde entry */
  62.   char (*buffer)[NAME_LENGTH]; /* Buffer voor programma namen */
  63. } BD;  /* Buffer descriptoe */
  64.  
  65. BD active, inactive;     /* Descriptor voor actieve
  66.                            en niet-actieve programma's */
  67.                            
  68. CPX_PARAMS *params;        /* Van controle-scherm overgenomen
  69.                            pointer op de controle-scherm
  70.                            functies */
  71.                      
  72. OBJECT *boot;            /* Pointer op dialoxg-boxen */
  73. OBJECT *error;
  74.  
  75. WORD scroll_param;        /* Overgave parameter voor scrollen */
  76.  
  77.  
  78. /*   Indecis voor dialogbox entries */
  79. WORD act[VISIBLE]={ ACTIVE1, ACTIVE2,
  80.                     ACTIVE3, ACTIVE4, ACTIVE5 };
  81. WORD inact[VISIBLE]={ INACTIV1, INACTIV2,
  82.                   INACTIV3, INACTIV4, INACTIV5 };
  83.           
  84. char empty[]="";        /* Strings voor dialogboxen */
  85. char underlined[]="________";
  86. char acc[]="*.ACC";
  87. char prg[]="*.PRG";
  88. char activate[]="ACC aktivieren";
  89. char deactivate[]="ACC deaktivieren";
  90.  
  91.  
  92. /* Prototypen voor Turbo-C */
  93. char boot_device(VOID);
  94. VOID change_object (OBJECT *tree, WORD object,
  95.                     WORD state );
  96. VOID copy(BD *dest, BD *source, WORD index);
  97. WORD get_entry(WORD object);
  98. OBJECT *get_traddr(WORD tree_index);
  99. CPX_INFO * cdecl init(CPX_PARAMS *params);
  100. VOID init_bd(char (*act_buff)[NAME_LENGTH],
  101.              char (*inact_buff)[NAME_LENGTH]);
  102. VOID init_slider(WORD *slider1_pos,
  103.                  WORD *slider2_pos, WORD draw);
  104. WORD cdecl main(GRECT *curr_wind);
  105. VOID into_resource(BD *bd, WORD draw);
  106. VOID move_vslider(OBJECT *tree, WORD parent,
  107.                   WORD slider, WORD *slider_pos,
  108.                   BD *bd);
  109. VOID pos_vslider(OBJECT *tree, WORD parent,
  110.                  WORD slider, WORD *slider_pos,
  111.                  BD *bd);
  112. VOID pulldown(WORD *slider1_pos,
  113.               WORD *slider2_pos);
  114. VOID read_config(char *type, BD *descriptor);
  115. VOID redraw_object(OBJECT *tree, WORD object);
  116. VOID refresh(WORD active_flag, WORD object);
  117. VOID scroll_down(VOID);
  118. VOID scroll_up(VOID);
  119. VOID unselect(WORD *array);
  120. VOID rename_file(VOID);
  121. VOID warning(VOID);
  122. VOID wind_center(OBJECT *tree, WORD *x, WORD *y,
  123.                  WORD *w, WORD *h);
  124.  
  125.  
  126. /* Functies */
  127.  
  128. /*********************************************/
  129. /* Initialisering van het module:            */
  130. /* Overgave parameter : pointer op de ter    */
  131. /*          beschikking staande functies     */
  132. /* 1. Aanroep bij het laden v/d header       */
  133. /*    (par->booting ==TRUE)                  */
  134. /*    Retour : 0 bij set_only, anders 1      */
  135. /* 2. Aanroep bij laden van het eigenlijke   */
  136. /*    programma (par->booting == FALSE)      */
  137. /*    Retour : Adres v/d CPX-info structuur  */
  138. /*********************************************/
  139.  
  140. CPX_INFO * cdecl init(CPX_PARAMS *par)
  141. {
  142.   static CPX_INFO info={ main,0L,0L,0L,0L,
  143.                          0L,0L,0L,0L,0L };
  144.   
  145.   if (par->booting)  /* bij het laden van de header */
  146.     return((CPX_INFO *)1L);
  147.   else  /* Aanroep bij laden v.h. programma */
  148.   {     /* Wissen van alle globale variabelen */
  149.     params=par;  /* pointers redden */
  150.     
  151.     /* Resource reloceren */
  152.     if (!params->rsc_init)
  153.       (*params->do_resource)(NUM_OBS,NUM_FRSTR,
  154.       NUM_FRIMG,NUM_TREE,rs_object,rs_tedinfo,
  155.       rs_strings,rs_iconblk,rs_bitblk,rs_frstr,
  156.       rs_frimg,rs_trindex,rs_imdope);
  157.       
  158.     /* Globale variabelen initialiseren */
  159.     boot=get_traddr(BOOT);
  160.     error=get_traddr(ERROR);
  161.     strncpy(activate,"ACC",3);
  162.     strncpy(deactivate,"ACC",3);
  163.     
  164.     
  165.     /* Dialogbox initialiseren */
  166.     boot[ACTION].ob_flags=NONE;
  167.     boot[ACTION].ob_spec.tedinfo->te_ptext=empty;
  168.     strcpy(boot[TYP].ob_spec.free_string,acc);
  169.     
  170.     
  171.     /* Adres der CPX_INFO-structuur retour */
  172.     return(&info);
  173.   }
  174. }
  175.  
  176.  
  177. /********************************************/
  178. /* Aanroep na dubbelklik op het icon in het */
  179. /* keuze venster : tekenen van de dialogbox */
  180. /* en afhandeling van de buttons.           */
  181. /* Overgave parameters : Coordinaten van    */
  182. /*          het werkbereik van het venster  */
  183. /* Retour : FALSE, als de dialog d.m.v.     */
  184. /*          do_form() wordt afgewerkt,      */
  185. /*          TRUE, in het geval dat eigen    */
  186. /*          event routines worden gebruikt  */
  187. /********************************************/
  188.  
  189. WORD cdecl main(GRECT *curr_wind)
  190. {
  191.   WORD msg_buff[8];
  192.   WORD button;
  193.   WORD abort_flag=FALSE;
  194.   char active_buff[MAX_ACTIVE][NAME_LENGTH];
  195.   char inactive_buff[MAX_INACTIVE][NAME_LENGTH];
  196.   WORD slider1_pos;
  197.   WORD slider2_pos;
  198.   WORD increment;
  199.   VOID (*function)();
  200.   WORD max;
  201.   
  202.   /* Coordinaten voor de dialogbox plaatsen */
  203.   boot[ROOT].ob_x=curr_wind->g_x;
  204.   boot[ROOT].ob_y=curr_wind->g_y;
  205.   
  206.   /* Buffer-descriptor initialiseren */
  207.   init_bd(active_buff,inactive_buff);
  208.   
  209.   /* Configuratie inlezen */
  210.   read_config("*.ACC",&active);
  211.   read_config("*.ACX",&inactive);
  212.   
  213.   /* ... en in de dialogbox plaatsen */
  214.   into_resource(&active,FALSE);
  215.   into_resource(&inactive,FALSE);
  216.   
  217.   /* Slider-grootte en positie initialiseren */
  218.   init_slider(&slider1_pos,&slider2_pos,FALSE);
  219.   
  220.   /* en dialogbox tekenen */
  221.   objc_draw(boot,ROOT,MAX_DEPTH,boot[ROOT].ob_x,
  222.             boot[ROOT].ob_y,boot[ROOT].ob_width,
  223.             boot[ROOT].ob_height);
  224.   
  225.   /* Dialogbox afwerken, totdat een exit-object
  226.     aangeklikt wordt. */
  227.   do
  228.   {
  229.     /* Nieuwe form_do()-aanroep */
  230.     button=(*params->do_form)(boot,0,msg_buff);
  231.     
  232.     /* Dubbelklik uitfilteren */
  233.     if (button>=0)
  234.       button &= 0x7fff;
  235.     
  236.     /* Slider variabelen instellen */
  237.     increment=1;
  238.     function=scroll_up;
  239.     
  240.     /* aangeklikte object bepalen */
  241.     switch (button)
  242.     {
  243.       /* Naam in "AKTIEF"-venster aangeklikt */
  244.       case ACTIVE1:
  245.       case ACTIVE2:
  246.       case ACTIVE3:
  247.       case ACTIVE4:
  248.       case ACTIVE5:
  249.         refresh(ACTIVE,button);
  250.         break;
  251.         
  252.       /* Naam in "INAKTIEF"-venster aangeklikt */
  253.       case INACTIV1:
  254.       case INACTIV2:
  255.       case INACTIV3:
  256.       case INACTIV4:
  257.       case INACTIV5:
  258.         refresh(INACTIVE,button);
  259.         break;
  260.       
  261.       /* File activeren/deactiveren */
  262.       case ACTION:
  263.         rename_file();
  264.         into_resource(&active,TRUE);
  265.         into_resource(&inactive,TRUE);
  266.         init_slider(&slider1_pos,&slider2_pos,
  267.                     TRUE);
  268.         refresh(ACTIVE,button);
  269.         break;
  270.       
  271.       /* "PIJL" in "ACTIEF"-venster aangeklikt */
  272.       case ACT_DOWN:
  273.         increment=-1;
  274.         function=scroll_down;
  275.         
  276.         
  277.       case ACT_UP:
  278.         scroll_param=ACTIVE;
  279.         max=((max=active.num-VISIBLE)<0) ? 0 :
  280.               max;
  281.         (*params->inc_slider)(boot,PARENT1,
  282.           SLIDER1,button,increment,0,max,
  283.           &slider1_pos,VERTICAL,function);
  284.         break;
  285.         
  286.         /* "PIJL" in "INACTIEF"-venster */
  287.         case INACT_DO:
  288.           increment=-1;
  289.           function=scroll_down;
  290.           
  291.         case INACT_UP:
  292.           scroll_param=INACTIVE;
  293.           max=((max=inactive.num-VISIBLE)<0) ? 0 :
  294.                 max;
  295.           (*params->inc_slider)(boot,PARENT2,
  296.             SLIDER2,button,increment,0,max,
  297.             &slider2_pos,VERTICAL,function);
  298.           break;
  299.           
  300.         /* Slider aangeklikt */
  301.         case SLIDER1:
  302.           move_vslider(boot,PARENT1,SLIDER1,
  303.                        &slider1_pos,&active);
  304.           break;
  305.         
  306.         case SLIDER2:
  307.           move_vslider(boot,PARENT2,SLIDER2,
  308.                        &slider1_pos,&active);
  309.           break;
  310.         
  311.         /* Slider-achtergrond aangeklikt */
  312.         case PARENT1:
  313.           pos_vslider(boot,PARENT1,SLIDER1,
  314.                       &slider1_pos,&active);
  315.           break;
  316.           
  317.         case PARENT2:
  318.           pos_vslider(boot,PARENT2,SLIDER2,
  319.                       &slider1_pos,&inactive);
  320.           break;
  321.         
  322.         /* "Aamwijs-type" aangeklikt */
  323.         case TYP:
  324.           pulldown(&slider1_pos,&slider2_pos);
  325.           break;
  326.         
  327.         /* Dialogbox verlaten */
  328.         case QUIT:
  329.           abort_flag=TRUE;
  330.           break;
  331.         
  332.         /* Nawoord plaatsen */
  333.         case MESSAGE:
  334.           switch (msg_buff[0])
  335.           {
  336.            case WM_REDRAW:  /* niet noodzakelijk */
  337.              break;
  338.            
  339.            case WM_CLOSED:  /* niets te bewaren */
  340.            case AC_CLOSE:
  341.              abort_flag=TRUE;
  342.              break;
  343.           }
  344.           break;
  345.     }
  346.   }
  347.   while (!abort_flag);
  348.   boot[button].ob_state &= ~SELECTED;
  349.   return(FALSE);
  350. }
  351.  
  352. /*******************************************/
  353. /* Levert het adres van een dialogbox      */
  354. /* (nieuwe rsrc_gaddr()-routine)           */
  355. /* Overgave parameters : Boom-index        */
  356. /* Retour: pointer op dialogbox            */
  357. /* *****************************************/
  358.  
  359. OBJECT *get_traddr(WORD tree_index)
  360. {
  361.   WORD i,j;
  362.   
  363.   for (i=0,j=0; i<=tree_index; i++)
  364.     while (rs_object[j++].ob_next!=-1);
  365.     
  366.   return(&rs_object[--j]);
  367. }
  368.  
  369.  
  370. /**********************************************/
  371. /* Inlezen v/d geactiveerde en gedeactiveerde */
  372. /* programma's.                               */
  373. /* Overgave parameter : programmatype, adres  */
  374. /*                      v/d buffer-descriptor */
  375. /* Retour : geen                              */
  376. /**********************************************/
  377.  
  378. VOID read_config(char *type, BD *descriptor)
  379. {
  380.   DTA *dta=Fgetdta();
  381.   WORD i=0;
  382.   WORD j,k;
  383.   char path[20];
  384.   path[0]=boot_device();
  385.   
  386.   /* Pad naargelang type opbouwen */
  387.   if (!strcmp(type,"*.ACC") ||
  388.       !strcmp(type,"*.ACX"))
  389.     strcpy(&path[1],":\\");
  390.   else
  391.     strcpy(&path[1],":\\AUTO\\");
  392.   strcat(path,type);
  393.   
  394.   /* alle namen van dit type inlezen */
  395.   if (!Fsfirst(path,0))
  396.     do
  397.     {
  398.       j=0;
  399.       while (dta->d_fname[j]!='.')
  400.         descriptor->buffer[i][j]=
  401.                               dta->d_fname[j++];
  402.       for (k=j; k<NAME_LENGTH-1; k++)
  403.         descriptor->buffer[i][k]=' ';
  404.       descriptor->buffer[i++][k]=EOS;
  405.     }
  406.     while (!Fsnext() && (i<descriptor->max_num));
  407.   descriptor->num=i;
  408.   if (descriptor->num==descriptor->max_num)
  409.     warning();
  410. }
  411.  
  412.  
  413. /**********************************************/
  414. /* In venster geselecteerde naan deselecteren */
  415. /* Overgave parameters : adres van een veld   */
  416. /*                       dat de indices van   */
  417. /*                       een venster entry    */
  418. /*                       bevat                */
  419. /* Retour : geen                              */
  420. /**********************************************/
  421.  
  422. VOID unselect(WORD *array)
  423. {
  424.   WORD i;
  425.   
  426.   for (i=0; i<VISIBLE; i++)
  427.     if (boot[array[i]].ob_state & SELECTED)
  428.     {
  429.       change_object(boot,array[i],NORMAL);
  430.       if (array==act)
  431.         active.selected=-1;
  432.       else
  433.         inactive.selected=-1;
  434.       break;
  435.     }
  436. }
  437.  
  438. /*********************************************/
  439. /* Object met nieuwe status tekenen.         */
  440. /* Overgave parameter : pointer op dialogbox */
  441. /*                      object-index, nieuwe */
  442. /*                      status               */
  443. /*********************************************/
  444.  
  445. VOID change_object(OBJECT *tree, WORD object,
  446.                    WORD state)
  447. {
  448.   WORD x,y;
  449.   
  450.   objc_offset(tree,object,&x,&y);
  451.   objc_change(tree,object,0,x,y,
  452.               tree[object].ob_width,
  453.               tree[object].ob_height,state,TRUE);
  454. }
  455.  
  456.  
  457. /*********************************************/
  458. /* Opnieuw tekenen van een object met behulp */
  459. /* van de door het control-veld geleverde    */
  460. /* rechthoek-lijst.                          */
  461. /* Overgave parameters : pointer op object-  */
  462. /*                       boom, Oject-index,  */
  463. /* Retour : geen                             */
  464. /*********************************************/
  465.  
  466. VOID redraw_object(OBJECT *tree, WORD object)
  467. {
  468.   GRECT *clip_ptr,clip,xywh;
  469.   
  470.   /* Absolute object coordinaten berekenen */
  471.   objc_offset(tree,object,&xywh.g_x,&xywh.g_y);
  472.   xywh.g_w=tree[object].ob_width;
  473.   xywh.g_h=tree[object].ob_height;
  474.   
  475.   
  476.   /* eerste rechthoek halen */
  477.   clip_ptr=(*params->rci_first)(&xywh);
  478.   
  479.   /* zolang er nog rechthoeken zijn */
  480.   while (clip_ptr)
  481.   {
  482.     /* clip_ptr: pointer op lokale variabele!! */
  483.     clip=*clip_ptr;   /* daarom copieren */
  484.     
  485.     /* Object opnieuw tekenen */
  486.     objc_draw(tree,object,MAX_DEPTH,clip.g_x,
  487.               clip.g_y,clip.g_w,clip.g_h);
  488.     
  489.     /* Volgende rechthoek halen */
  490.     clip_ptr=(*params->rci_next)();
  491.   }
  492. }
  493.  
  494.  
  495. /***********************************************/
  496. /* Geselecteerde entry in venster deselecteren */
  497. /* en naar gelang de aangeklikte entry de      */
  498. /* aktie-knop opnieuw tekenen.                 */
  499. /* Overgave parameter : venster identificatie, */
  500. /*                      aangeklikt object      */
  501. /* Retour : geen                               */
  502. /***********************************************/
  503.  
  504. VOID refresh(WORD active_flag, WORD object)
  505. {
  506.   /* Uitgifte melding bepalen */
  507.   char *status=((active_flag==ACTIVE) ?
  508.                  deactivate : activate);
  509.   /* Geselecteerde entry in ander venster
  510.      deselecteren */
  511.   unselect((active_flag==ACTIVE) ? inact : act);
  512.   
  513.   /* Geen geldige entry aangeklikt */
  514.   if ((boot[object].ob_spec.tedinfo->te_ptext==
  515.        underlined) || (object==ACTION))
  516.   {
  517.     /* Geselecteerde entry in actuele venster
  518.        deselecteren */
  519.     unselect((active_flag==ACTIVE) ?
  520.               act : inact);
  521.   
  522.   /* Aktie-knop afschakelen */
  523.   boot[ACTION].ob_spec.tedinfo->te_ptext=empty;
  524.   boot[ACTION].ob_state &= ~SELECTED;
  525.   boot[ACTION].ob_flags=NONE;
  526.   redraw_object(boot,ACTION);
  527. }
  528. else
  529. {
  530.   /* geldige entry aangeklikt */
  531.   if (boot[ACTION].ob_spec.tedinfo->te_ptext!=
  532.       status)
  533.   {
  534.     /* Aktie-knop inschakelen */
  535.     boot[ACTION].ob_spec.tedinfo->te_ptext=
  536.       status;
  537.     boot[ACTION].ob_flags=SELECTABLE|TOUCHEXIT;
  538.     redraw_object(boot,ACTION);
  539.   }
  540.   
  541.   /* Index v/d geselecteerde entry markeren */
  542.   if (status==activate)
  543.     inactive.selected=inactive.begin+
  544.                       get_entry(object);
  545.   else
  546.     active.selected=active.begin+
  547.                     get_entry(object);
  548.   }
  549. }
  550.  
  551. /**********************************************/
  552. /* Index van de aangeklikte entry bepalen     */
  553. /* Overgave parameters : aangeklikte object   */
  554. /* Retour : gezochte index                    */
  555. /**********************************************/
  556.  
  557. WORD get_entry(WORD object)
  558. {
  559.   WORD i;
  560.   
  561.   for (i=0; i<VISIBLE; i++)
  562.     if ((object==act[i]) || (object==inact[i]))
  563.       break;
  564.   return(i);
  565. }
  566.  
  567. /*********************************************/
  568. /* Uitgekozen file hernoemen                 */
  569. /* Overgave parameters : geen                */
  570. /* Retour : geen                             */
  571. /*********************************************/
  572.  
  573. VOID rename_file(VOID)
  574. {
  575.   WORD i;
  576.   WORD *array;
  577.   WORD index;
  578.   WORD begin;
  579.   char path1[30],path2[30];
  580.   char (*buffer)[NAME_LENGTH];
  581.   char flag=boot[ACTION].ob_spec.tedinfo->
  582.                                   te_ptext[4];
  583.   if (flag=='a')
  584.   {
  585.     /* adressen voor file activeren */
  586.     array=inact;
  587.     begin=inactive.begin;
  588.     buffer=inactive.buffer;
  589.   }
  590.   else
  591.   {
  592.     /* adressen voor file deactiveren */
  593.     array=act;
  594.     begin=active.begin;
  595.     buffer=active.buffer;
  596.   }
  597.   
  598.   /* Index van de geselecteerde entry bapalen */
  599.   for (i=0; i<VISIBLE; i++)
  600.     if (boot[array[i]].ob_state & SELECTED)
  601.       break;
  602.   index=begin+i;
  603.   
  604.   /* Pad naar gelang type programma aanmaken */
  605.   path1[0]=boot_device();
  606.   strcpy(&path1[1],((active.type==ACC) ? ":\\" :
  607.                      ":\\AUTO\\"));
  608.   strcat(path1,buffer[index]);
  609.   
  610.   for (i=(WORD)strlen(path1)-1; i>=0; i--)
  611.     if (path1[i]!=' ')
  612.     {
  613.       path1[++i]=EOS;
  614.       break;
  615.     }
  616.     
  617.   strcat(path1,((active.type==ACC) ?
  618.                 ".ACC" : ".PRG"));
  619.   strcpy(path2,path1);
  620.   path1[strlen(path1)-1]='X';
  621.   
  622.   /* File hernoemen */
  623.   if (flag=='a')
  624.   {
  625.     if (Frename(0,path1,path2)>=0)
  626.       copy(&active,&inactive,index);
  627.   }
  628.   else
  629.   {
  630.     if (Frename(0,path2,path1)>=0)
  631.       copy(&inactive,&active,index);
  632.   }
  633. }
  634.  
  635.  
  636. /***********************************************/
  637. /* Hernoemde file uit de ene lijst verwijderen */
  638. /* en in de andere lijst plaatsen.             */
  639. /* Overgave parameters : pointer op doel- en   */
  640. /*                       bron-descriptor,      */
  641. /*                       Index van de te       */
  642. /*                       verwijderen entry     */
  643. /* Retour : geen                               */
  644. /***********************************************/
  645.  
  646. VOID copy(BD *dest, BD *source, WORD index)
  647. {
  648.   WORD i;
  649.   
  650.   /* Entry in doel-lijst plaatsen */
  651.   if (dest->num<dest->max_num)
  652.     strcpy(dest->buffer[dest->num++],
  653.            source->buffer[index]);
  654.   else
  655.     warning();
  656.   
  657.   /* Entry uit de bron-lijst wissen */
  658.   source->num--;
  659.   for (i=index; i<source->num; i++)
  660.     strcpy(source->buffer[i],
  661.            source->buffer[i+1]);
  662.   source->begin=dest->begin=0;
  663. }
  664.  
  665.  
  666. /**********************************************/
  667. /* Waarschuwing voor overloop lijst uitgeven  */
  668. /* Overgave parameters : geen                 */
  669. /* Retour : geen                              */
  670. /**********************************************/
  671.  
  672. VOID warning(VOID)
  673. {
  674.   WORD x,y,w,h;
  675.   
  676.   /* Naam-lijst vol */
  677.   wind_center(error,&x,&y,&w,&h);
  678.   objc_draw(error,ROOT,MAX_DEPTH,x-3,y-3,w+6,h+6);
  679.   form_do(error,0);
  680.   error[MIST].ob_state &= ~SELECTED;
  681.   objc_draw(boot,ROOT,MAX_DEPTH,boot[ROOT].ob_x,
  682.             boot[ROOT].ob_y,boot[ROOT].ob_width,
  683.             boot[ROOT].ob_height);
  684. }
  685.  
  686.  
  687. /**********************************************/
  688. /* Boot-drive bepalen                         */
  689. /* Overgave parameters : geen                 */
  690. /* Retour : boot-drive                        */
  691. /**********************************************/
  692.  
  693. char boot_device(VOID)
  694. {
  695.   LONG ssp;
  696.   char boot;
  697.   
  698.   ssp=Super((VOID *)0L);
  699.   boot=*(BYTE *)_bootdev+'A';
  700.   Super((VOID *)ssp);
  701.   return(boot);
  702. }
  703.  
  704.  
  705. /***********************************************/
  706. /* In het venster naar boven scrollen          */
  707. /* Overgave parameters : vensterkenmerkem      */
  708. /*                       indirekt via scroll-  */
  709. /*                       parameters            */
  710. /* Retour : Geen                               */
  711. /***********************************************/
  712.  
  713. VOID scroll_up(VOID)
  714. {
  715.   BD *bd=((scroll_param==ACTIVE) ?
  716.           &active : &inactive);
  717.   if (bd->begin>0)
  718.   {
  719.     bd->begin--;
  720.     into_resource(bd,TRUE);
  721.   }
  722. }
  723.  
  724. /***********************************************/
  725. /* In het venster naar beneden scrollen        */
  726. /* Overgave parameters : vensterkenmerken      */
  727. /*                       indirekt via scroll-  */
  728. /*                       parameters            */
  729. /* Retour : Geen                               */
  730. /***********************************************/
  731.  
  732. VOID scroll_down(VOID)
  733. {
  734.   BD *bd=((scroll_param==ACTIVE) ?
  735.           &active : &inactive);
  736.   if (bd->begin+VISIBLE<bd->num)
  737.   {
  738.     bd->begin++;
  739.     into_resource(bd,TRUE);
  740.   }
  741. }
  742.  
  743. /***********************************************/
  744. /* Namenlijst in de dialogbox plaatsen         */
  745. /* Overgave parameters : pointer op buffer-    */
  746. /*                       descriptor,teken-flag */
  747. /* Retour : Geen                               */
  748. /***********************************************/
  749.  
  750. VOID into_resource(BD *bd, WORD draw)
  751. {
  752.   WORD i;
  753.   WORD *array=((bd==&active) ? act : inact);
  754.   
  755.   for (i=0; i<VISIBLE; i++)
  756.     if (bd->begin+i<bd->num)
  757.     {
  758.       /* Entry beschikbaar */
  759.       boot[array[i]].ob_spec.tedinfo->te_ptext=
  760.         bd->buffer[bd->begin+i];
  761.       boot[array[i]].ob_flags=SELECTABLE |
  762.         RBUTTON | TOUCHEXIT;
  763.       if (bd->begin+1==bd->selected)
  764.         boot[array[i]].ob_state |= SELECTED;
  765.       else
  766.         boot[array[i]].ob_state &= ~SELECTED;
  767.     }
  768.     else
  769.     {
  770.       /* Geen entry meer */
  771.       boot[array[i]].ob_spec.tedinfo->te_ptext=
  772.         underlined;
  773.       boot[array[i]].ob_flags=TOUCHEXIT;
  774.       boot[array[i]].ob_state &= ~SELECTED;
  775.     }
  776.   /* Lijst opnieuw uitgeven */
  777.   if (draw)
  778.     redraw_object(boot,(array==act) ?
  779.                   ACTWIND : INACWIND);
  780. }
  781.  
  782.  
  783. /***************************************************/
  784. /* Verticale slider positioneren                   */
  785. /* Overgave parameters : pointer op dialogbox,     */
  786. /*                       index slider-achtergrond. */
  787. /*                       index slider, pointer op  */
  788. /*                       slider-positie, buffer-   */
  789. /*                       descriptor                */
  790. /* Retour : Geen                                   */
  791. /***************************************************/
  792.  
  793. VOID pos_vslider(OBJECT *tree, WORD parent,
  794.                  WORD slider, WORD *slider_pos,
  795.                  BD *bd)
  796. {
  797.   WORD my,y;
  798.   WORD dummy;
  799.   WORD max,temp;
  800.   
  801.   
  802.   /* Coordinaten inlezen */
  803.   graf_mkstate(&dummy,&my,&dummy,&dummy);
  804.   objc_offset(tree,slider,&dummy,&y);
  805.   
  806.   /* Naar gelang positie van de muis naar boven
  807.      of naar beneden scrollen */
  808.   if (my<y)
  809.     *slider_pos=((max=bd->num-VISIBLE)<=
  810.                 (temp=*slider_pos+VISIBLE)) ?
  811.                 max : temp;
  812.   else
  813.     *slider_pos=((max=*slider_pos-VISIBLE)<0) ?
  814.                 0 : max;
  815.   /* slider opnieuw positioneren */
  816.   max=((max=bd->num-VISIBLE)<0) ? 0 : max;
  817.   (*params->pos_vslider)(tree,parent,slider,
  818.                          *slider_pos,0,max,NIL);
  819.   
  820.   /* Namenlijst uitgeven */
  821.   bd->begin=((max=bd->num-VISIBLE-*slider_pos)<0)
  822.              ? 0 : max;
  823.   into_resource(bd,TRUE);
  824.   redraw_object(tree,parent);
  825. }
  826.  
  827.  
  828. /**************************************************/
  829. /* Verticale slider verschuiven                   */
  830. /* Overgave parameters : pointer op dialogbox,    */
  831. /*                       index slider-achtergrond */
  832. /*                       index slider, pointer op */
  833. /*                       slider positie, buffer-  */
  834. /*                       descriptor               */
  835. /* Retour : Geen                                  */
  836. /**************************************************/
  837.  
  838. VOID move_vslider(OBJECT *tree, WORD parent,
  839.                   WORD slider, WORD *slider_pos,
  840.                   BD *bd)
  841. {
  842.   WORD max;
  843.   
  844.   max=((max=bd->num-VISIBLE)<0) ? 0 : max;
  845.   (*params->move_vslider)(tree,parent,slider,0,
  846.                           max,slider_pos,NIL);
  847.   
  848.   /* Naar gelang de slider-positie de naamlijst 
  849.      opnieuw uitgeven */
  850.   bd->begin=((max=bd->num-VISIBLE-*slider_pos)<0)
  851.              ? 0 : max;
  852.   into_resource(bd,TRUE);
  853. }
  854.  
  855.  
  856. /***************************************************/
  857. /* Buffer-descriptor initialiseren                 */
  858. /* Overgave parameters : pointers op beide buffers */
  859. /* Retour : geen                                   */
  860. /***************************************************/
  861.  
  862. VOID init_bd(char (*act_buff)[NAME_LENGTH],
  863.              char (*inact_buff)[NAME_LENGTH])
  864. {
  865.   active.buffer=act_buff;
  866.   active.max_num=MAX_ACTIVE;
  867.   active.begin=0;
  868.   active.type=ACC;
  869.   active.selected=-1;
  870.   
  871.   inactive.buffer=inact_buff;
  872.   inactive.max_num=MAX_INACTIVE;
  873.   inactive.begin=0;
  874.   inactive.type=ACC;
  875.   inactive.selected=-1;
  876. }
  877.  
  878.  
  879. /*********************************************/
  880. /* Slider-positie en grootte initialiseren   */
  881. /* Overgave parameters : pointer op de beide */
  882. /*                       slider-posities     */
  883. /*                       tekenvlak.          */
  884. /* Retour : Geen                             */
  885. /*********************************************/
  886.  
  887. VOID init_slider(WORD *slider1_pos,
  888.                  WORD *slider2_pos, WORD draw)
  889. {
  890.   WORD max;
  891.   
  892.   /* Slider-grootte instellen */
  893.   (*params->size_slider)(boot,PARENT1,SLIDER1,
  894.                          active.num,VISIBLE,
  895.                          VERTICAL,MIN_SIZE);
  896.   (*params->size_slider)(boot,PARENT2,SLIDER2,
  897.                          inactive.num,VISIBLE,
  898.                          VERTICAL,MIN_SIZE);
  899.                          
  900.   /* Slider-positie instellen */
  901.   *slider1_pos=((max=active.num-VISIBLE),0) ?
  902.                 0 : max;
  903.   (*params->pos_vslider)(boot,PARENT1,SLIDER1,
  904.                          *slider1_pos,0,max,NIL);
  905.   *slider2_pos=((max=inactive.num-VISIBLE),0) ?
  906.                 0 : max;
  907.   (*params->pos_vslider)(boot,PARENT2,SLIDER2,
  908.                          *slider2_pos,0,max,NIL);
  909.                          
  910.   /* Slider opnieuw tekenen */
  911.   if (draw)
  912.   {
  913.     redraw_object(boot,PARENT1);
  914.     redraw_object(boot,PARENT2);
  915.   }
  916. }
  917.  
  918.  
  919. /***********************************************/
  920. /* Dialogbox in het venster centreren          */
  921. /* Overgave parameters : pointer op dialogbox  */
  922. /*                       coordinaten           */
  923. /* Retour : indirect via coordinaten           */
  924. /***********************************************/
  925.  
  926. VOID wind_center(OBJECT *tree, WORD *x, WORD *y,
  927.                                WORD *w, WORD *h)
  928. {
  929.   tree[ROOT].ob_x=boot[ROOT].ob_x+
  930.                   (boot[ROOT].ob_width-
  931.                   tree[ROOT].ob_width)/2;
  932.   tree[ROOT].ob_y=boot[ROOT].ob_y+
  933.                   (boot[ROOT].ob_height-
  934.                   tree[ROOT].ob_height)/2;
  935.   
  936.   *x=tree[ROOT].ob_x;
  937.   *y=tree[ROOT].ob_y;
  938.   *w=tree[ROOT].ob_width;
  939.   *h=tree[ROOT].ob_height;
  940. }
  941.  
  942.  
  943. /**********************************************/
  944. /* Pulldown-menu genereren, plaatsen en       */
  945. /* waarderen                                  */
  946. /* Overgave parameters : pointer op slider-   */
  947. /*                       positie              */
  948. /* Retour : geen                              */
  949. /**********************************************/
  950.  
  951. VOID pulldown(WORD *slider1_pos,
  952.               WORD *slider2_pos)
  953. {
  954.   WORD index,checked;
  955.   GRECT button_xywh,window_xywh;
  956.   char *pull_adr[2];
  957.   char pull_buff[2][15];
  958.   
  959.   /* tekst van menu in buffer plaatsen */
  960.   strcpy(pull_buff[0],"  ");
  961.   strcat(pull_buff[0],acc);
  962.   strcat(pull_buff[0],"  ");
  963.   
  964.   strcpy(pull_buff[1],"  ");
  965.   strcat(pull_buff[1],prg);
  966.   strcat(pull_buff[1],"  ");
  967.   
  968.   /* Index van de afgehakte entry */
  969.   index=(!strcmp(boot[TYP].ob_spec.free_string,
  970.          acc) ? 0 : 1);
  971.   
  972.   /* Absolute button coordinaten berekenen */
  973.   objc_offset(boot,TYP,&button_xywh.g_x,
  974.               &button_xywh.g_y);
  975.   button_xywh.g_w=boot[TYP].ob_width;
  976.   button_xywh.g_h=boot[TYP].ob_height;
  977.   
  978.   
  979.   /* Absolute coordinaten van de dialogbox
  980.      bepalen */
  981.      
  982.   objc_offset(boot,ROOT,&window_xywh.g_x,
  983.     &window_xywh.g_h);
  984.   window_xywh.g_w=boot[ROOT].ob_width;
  985.   window_xywh.g_h=boot[ROOT].ob_height;
  986.   
  987.   
  988.   /* Adressen van de enkele entries in de 
  989.      overgave-array plaatsen */
  990.   pull_adr[0]=pull_buff[0];
  991.   pull_adr[1]=pull_buff[1];
  992.   
  993.   /* Pull-down menu's laten tekenen en index van
  994.      de aangeklikte entries terug leveren */
  995.   checked=(*(params->do_pulldown))
  996.     (pull_adr,2,index,IBM,
  997.     &button_xywh,&window_xywh);
  998.   
  999.   /* Als een entry werd aangeklikt... */
  1000.   if (checked>=0)
  1001.   {
  1002.     /* ...dan nieuwe entry button */
  1003.     boot[TYP].ob_spec.free_string=
  1004.                       ((checked==0) ? acc : prg);
  1005.     boot[TYP].ob_state &= ~SELECTED;
  1006.     redraw_object(boot,TYP);
  1007.     
  1008.     
  1009.     if (checked!=index)
  1010.     {
  1011.       /* Naar gelang geselecteerde entry nieuwe 
  1012.          configuratie inlezen */
  1013.       switch (checked)
  1014.       {
  1015.         case 0:
  1016.           strncpy(activate,"ACC",3);
  1017.           strncpy(deactivate,"ACC",3);
  1018.           active.type=inactive.type=ACC;
  1019.           read_config("*.ACC",&active);
  1020.           read_config("*.ACX",&inactive);
  1021.           break;
  1022.         
  1023.         case 1:
  1024.           strncpy(activate,"PRG",3);
  1025.           strncpy(deactivate,"PRG",3);
  1026.           active.type=inactive.type=PRG;
  1027.           read_config("*.PRG",&active);
  1028.           read_config("*.PRX",&inactive);
  1029.           break;
  1030.       }
  1031.       
  1032.       /* Nieuwe configuratie tonen */
  1033.       boot[ACTION].ob_flags=NONE;
  1034.       boot[ACTION].ob_spec.tedinfo->te_ptext=
  1035.                                           empty;
  1036.       redraw_object(boot,ACTION);
  1037.       
  1038.       active.begin=inactive.begin=0;
  1039.       active.selected=inactive.selected=-1;
  1040.       
  1041.       into_resource(&active,TRUE);
  1042.       into_resource(&inactive,TRUE);
  1043.       
  1044.       init_slider(slider1_pos,slider2_pos,TRUE);
  1045.     }
  1046.   }
  1047. }
  1048.  
  1049.